local nl = require'luaNumeric'
require 'luaFDTD3D'
local plot = require "Q2DViewerEx"

----------------------------------------------------------------------------------------------------------------------------------------
--初始化参数
local DataView={
	funs = {};
	xAxis = 0;
	ytype = 1;
	xtype = 1;
	selectedViewName='';
};
----------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------
--创建表和创建元表
function DataView:new (o)
	o = o or {};
	self.__index = self;
	setmetatable(o,self)
	o:init();
	return o;
end
----------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------
--创建表和创建元表
function DataView:init ()
	self.funs = {};
	self.funs.abs = function(input) return nl.abs(input); end;
	self.funs.phs = function(input) return nl.arg(input)*180/pi; end;
	self.funs.real = function(input) return nl.real(input); end;
	self.funs.imag = function(input) return nl.imag(input); end;
	self.funs.log = function(input) 
		local  d = nl.abs(input);		
		for k,v in pairs(d) do 
			if d[k] < 1e-200 then d[k] = 1e-200; end
		end
		d = 20* nl.log10(d)
		return d; 
	end;
	self.fun_names = {};
	self.fun_names[1] = 'log';
	self.fun_names[2] = 'abs';
	self.fun_names[3] = 'phs';
	self.fun_names[4] = 'real';
	self.fun_names[5] = 'imag';	
	self.ytype = 1;
end
----------------------------------------------------------------------------------------------------------------------------------------


----------------------------------------------------------------------------------------------------------------------------------------
--更新数据
function DataView:refresh_figs ()
	print( 'refresh:',self.probe:name() )
	self.probe:update();
	self.results = self.probe:results();
	self:plot()
end
----------------------------------------------------------------------------------------------------------------------------------------


---==================================================================================================---
--画图
function DataView:plot (data, valid, strs)
	Gallop.View:plot2D(data,valid,strs);
end
---==================================================================================================---


----------------------------------------------------------------------------------------------------------------------------------------
--画图
function DataView:rescale ()
	self:update_parameters_from_ui();
	self:plot();
end
----------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------
--坐标设置
function DataView:set_axis()
	if self.xtype ==2 then
		self.view.xAxis:setProperty( {name="波长 ["..Geometry.ref_units_dim_str()..']'} )
	else
		self.view.xAxis:setProperty( {name="频率 ["..Geometry.ref_units_freq_str()..']'} )
	end
	
	if self.ytype ==1 then
		self.view.yAxis:setProperty( {name="S parameter [dB]"} )
	elseif self.ytype ==2 then
		self.view.yAxis:setProperty( {name="S parameter [Mag.]"} )
	elseif self.ytype ==3 then
		self.view.yAxis:setProperty( {name="Argument of S parameter [arc.]"} )
	elseif self.ytype ==4 then
		self.view.yAxis:setProperty( {name="Real part of S parameter"} )
	elseif self.ytype ==5 then
		self.view.yAxis:setProperty( {name="Imag part of S parameter"} )
	end
	 self.view:rescaleAxes();
end
----------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------
--导出
function DataView:export_data (path)
	print(path);
	self.probe:save(path);
end
----------------------------------------------------------------------------------------------------------------------------------------


----------------------------------------------------------------------------------------------------------------------------------------
--更新数据
function DataView:refresh_figs ()
	self.probe:update();
	self.results = self.probe:results();
	self:plot()
end
----------------------------------------------------------------------------------------------------------------------------------------

---==================================================================================================---
--获得二维视图列表
function DataView:get_view_list(list)
	--print( 'get list' )
	Gallop.View:get_view2D_list(list)
end
---==================================================================================================---

---==================================================================================================---
--添加二维视图
function DataView:get_selected_view()
	return self.selectedViewName;
end
---==================================================================================================---

---==================================================================================================---
--添加二维视图
function DataView:add_view()	
	self.view2d,self.selectedViewName=Gallop.View:create_view2D();
	self:update_view_list_to_ui();
end
---==================================================================================================---


---==================================================================================================---
--选择二维视图
function DataView:select_view(name)
	--print(name)
	self.selectedViewName = name;
	self.view2d = Gallop.View:select_view(name);
end
---==================================================================================================---

---==================================================================================================---
--选择二维视图
function DataView:select_active_view()
	--self.view=Gallop.View:select_active_view();
	for k,v in pairs ( Gallop.View.view2Ds ) do 
		--print(k,v);
	end
end
---==================================================================================================---

---==================================================================================================---
--清楚二维视图
function DataView:clear_curves()
	assert(self.view2d, "You should creat or select a viewer first" )
	self.view2d:clearGraphs()
	self.view2d:rescaleAxes();
end
---==================================================================================================---

---==================================================================================================---
--画图: 三维标量场
function DataView:plot_3d_scalarfields(data,valid, strs)
	local ncols = #data;
	for ii=4,ncols do 
		local fields = Geometry.NewTrigScalarFields3D();
		fields:insert( data[1],data[2],data[3],data[ii], valid[1],valid[2],valid[3],valid[ii],strs[ii]);		
		Geometry.AddShape(fields);
	end
end
---==================================================================================================---

---==================================================================================================---
--画图: 二维标量场
function DataView:plot_2d_scalarfields(data,valid, strs)
	local ncols = #data;
	for ii=3,ncols do 
		local fields = Geometry.NewTrigScalarFields2D();
		fields:insert_array( data[1],data[2],data[ii], valid[1],valid[2],valid[ii],strs[ii]);	
		fields:render_coordinate(1)
		Geometry.AddShape(fields);
	end
end
---==================================================================================================---


---==================================================================================================---
--画图: 二维标量方向图场
function DataView:plot_2d_scalarfields_in_spherical_coordinate(data,valid, strs)
	local ncols = #data;
	for ii=3,ncols do 
		local fields = Geometry.NewTrigScalarFields2D();
		fields:insert_array( data[1],data[2],data[ii], valid[1],valid[2],valid[ii],strs[ii]);	
		Geometry.AddShape(fields);
	end
end
---==================================================================================================---

---==================================================================================================---
--画图: 二维标量方向图场
function DataView:close()
	for k, v in pairs(Gallop.DataPost.widgets) do
	    if v == self then
		Gallop.DataPost.widgets[k] = nil;
		break
	    end
	end
end
---==================================================================================================---

return DataView;
